(function() {

    // ============== for Service Provider ==============

    // サービスの作成
    var service = wmr.service.create("bookService", {
	// サービスのメソッド定義（結果は同期で返す）
	create: function(book) {
	    var bookRecord = localDB.save(book);

	    // イベント発生
	    //var event = new MessageEvent();
	    //event.initMessageEvent("create", false, false, {some:"data"});
	    //this.dispatchEvent(event);
	    // 上のコードを楽にする
	    this.triggerEvent("create", {some:"data"});
	    
	    return bookRecord;
	},
	// サービスのメソッド定義（結果は非同期で返す）
	async_find: function(callback, bookId) {
	    asyncGetFromServer(bookId, {
		success: function(book) {
		    callback.success(book);
		},
		error: function(err) {
		    callback.error(err);
		}
	    });
	}
    });

    // ============== for Service Consumer ==============

    // Web Messaging関連のオブジェクトを個別に作成
    var worker = new Worker("worker.js"); // ワーカ
    var win = window.open("other.html"); // ウィンドウ（クロスドキュメントメッセージング）
    var sharedWorker = new SharedWorker("shared_worker.js"); // 共有ワーカ
    var webSocket = new WebSocket("ws://localhost/api", "wmr");
    var chromeExtension = new ChromeExtension("extensionId"); // Google Chrome Extension

    // プロキシファクトリ生生
    wmr.proxy.configure(worker, {
	success: function() {
	    var bookService = proxies.getProxy("bookService");
	    bookService.onerror = function() {
		// グローバルなエラー処理
	    };
	    // メソッド呼び出し（正常時の結果のみ取得）
	    bookService.findById("BOOK_ID", function(book) {
	    });
	    // メソッド呼び出し（正常時、エラー時の結果を個別に取得）
	    bookService.create({some:"book"}, {
		success: function(newBook) {},
		error: function(error) {}
	    });

	    // 
	    bookService.addEventListener("create", function(event) {

	    }, false);
	    bookService.oncreate = function(event) {
	    }
	}
    };
    // プロキシの生成失敗
    proxies.onerror = function(errorEvent) {
    };
    // 全プロキシ名を取得
    var proxyNames = proxies.proxyNames();

    // ============== for Framework Developers ==============

    // WebSocket用のプロキシファクトリを追加
    wmr.proxy.addFactory("WebSocket", function(source) {
	// WebSocketを介して通信
	if (source instanceof WebSocket) {
	    // WebSocketを通じてプロキシ作成
	}
    });
    // プロキシファクトリの名前を全て取得
    var factoryNames = wmr.proxy.factoryNames();
})();
